package cn.test.future.cf;

import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;

/**
 * 对于烧水泡茶这个程序，一种最优的分工方案：
 * 用两个线程 T1 和 T2 来完成烧水泡茶程序，
 * T1 负责洗水壶、烧开水、泡茶这三道工序，
 * T2 负责洗茶壶、洗茶杯、拿茶叶三道工序，
 * 其中 T1 在执行泡茶这道工序时需要等待 T2 完成拿茶叶的工序。
 */

// 基于FutureTask实现
public class Tea {
    public static void main(String[] args) throws ExecutionException, InterruptedException {
        FutureTask<String> task2 = new FutureTask<>(new Task2());

        FutureTask<String> task1 = new FutureTask<>(new Task1(task2));

        new Thread(task1).start();
        new Thread(task2).start();

        String s = task1.get();
        System.out.println(s);
    }

    static class Task1 implements Callable<String> {
        private FutureTask<String> task2;

        public Task1(FutureTask<String> task2) {
            this.task2 = task2;
        }

        @Override
        public String call() throws Exception {
            System.out.println("T1: 洗水壶");
            System.out.println("T1: 烧开水");

            String s = task2.get();
            System.out.println(s);

            System.out.println("T1: 泡茶");

            return "茶泡好了";
        }
    }

    static class Task2 implements Callable<String> {

        @Override
        public String call() throws Exception {
            System.out.println("T2： 洗茶壶");
            System.out.println("T2： 洗茶杯");
            System.out.println("T2： 拿茶叶");
            return "T2 执行完了";
        }
    }
}
